//
//  ReversiController.h
//  Reversi
//	リバーシボードウインドウのコントローラー
//
//  Created by 成瀬 龍人 on 2/4/10.
//  Copyright 2010 __MyCompanyName__. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "ReversiBoard.h"
#import "ReversiBoardViewString.h"
#import "ReversiBoardPosition.h"
#import "ReversiPlaying.h"
#import "ReversiPlayer.h"

@interface ReversiController : NSObject {
	//	ボードの表示内容
	NSObject<ReversiBoardView>* boardView;
	//	初期化ウインドウ
	IBOutlet NSPanel*     initializePanel;
	//	ゲームオーバーウインドウ
	IBOutlet NSPanel*     gameResultPanel;
	//	リバーシボードウインドウ
	IBOutlet NSWindow*	  reversiWindow; 
	
	//	リバーシボードモデルオブジェクト
	ReversiBoard* board;
	//	現在ターンのプレイヤーの石の色
	ReversiStone currentPlayerStone;
	//	現在のターンのプレイヤー
	NSObject<ReversiPlaying>* currentPlayer;
	//	先手プレヤー
	NSObject<ReversiPlaying>* firstPlayer;
	//	後手プレヤー
	NSObject<ReversiPlaying>* secondPlayer;
	
	//	putStoneの状態を表すメソッド
	SEL putStoneInCurrentState;
}

//	YESを返せば、ウインドウが閉じられたら、アプリケーションを終了する
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication*)application;

//	アプリケーション起動時のイベントハンドラ (File's Ownerのデリゲートメソッド)
//	アプリケーションを初期化する
- (void)applicationDidFinishLaunching:(NSNotification*)notification;

//	NSButtonが押されたときのイベントハンドラ (putボタンのイベント)
//	コントローラーの状態に応じたメソッドを呼び出す
- (void)put:(ReversiBoardPosition*)pos;
- (void)pass;

//	NSButtonが押されときのイベントハンドラ (initボタンのイベント)
//	ゲームの初期化ウインドウを開く
- (IBAction)openInitializeWindow:(id)sender;

//  リバーシボードを初期化する
//  @param	aFirstPlayer	先手のプレイヤーオブジェクト．
//							Display string is "@"
//	@param	aSecondPlayer	後手のプレイヤーオブジェクト．
//							Display string is "O"
- (void)initReversi:(NSObject<ReversiBoardView>*)view:(NSObject<ReversiPlaying>*)aFirstPlayer:(NSObject<ReversiPlaying>*)aSecondPlayer;

//	-(IBAction)putStone: の状態に応じたmethod (select stone position state)
//	石を置く場所を選択する
- (void)_putStoneInSelectStonePositionState:(ReversiBoardPosition*)pos;

//	-(IBAction)putStone: の状態に応じたmethod (animation state)
//	アニメーション中にputボタンが押された場合に呼び出される
- (void)_putStoneInAnimationState:(ReversiBoardPosition*)pos;

//	石を返すアニメーションを更新する
//	This method is calld by NSTimer
- (void)_updateInvalidPutPosAnimation:(NSTimer*)timer;
- (void)_updatePassAnimation:(NSTimer*)timer;
- (void)_updatePutAnimation:(NSTimer*)timer;

//	黒が勝っているか？
//	ゲームオーバーに成っていなくても石の数が多ければtrueを返す
- (bool)isBlackWin;

//	白が勝っているか？
//	ゲームオーバーに成っていなくても石の数が多ければtrueを返す
- (bool)isWhiteWin;

//	引き分けか？
- (bool)isDraw;

@end
